﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using RayTracer;
using System.IO;
using System.Xml;

namespace GPURayTracer
{
    /// <summary>
    /// Stellt die Bildfläche des Raytracers dar.
    /// Übernimmt alle technischen Funktionen.
    /// </summary>
    public partial class MainForm : Form
    {
        #region Methoden
        /// <summary>
        /// Instanziiert und initialisiert die Klasse.
        /// </summary>
        public MainForm()
        {
            InitializeComponent();
            Settings(true);
        }

        /// <summary>
        /// Trifft Einstellungen.
        /// </summary>
        /// <param name="required">Indikator ob die Einstellungen essentiell sind.</param>
        public void Settings(bool required)
        {
            SettingsForm sf = new SettingsForm();
            sf.ShowDialog(this);
            if (sf.DialogResult == System.Windows.Forms.DialogResult.OK)
            {
                MaximumSize = sf.MaxWindowResolution;
                if (required)
                {
                    try
                    {
                        // Falls beim Programmstart ein Parameter gesetzt wurde wird hier ggf. die Standardszene gesetzt.
                        if (Program.Arguments.Length > 0)
                        {
                            if (File.Exists(Program.Arguments[0]))
                            {
                                XmlDocument xmlDoc = new XmlDocument();
                                xmlDoc.Load(Program.Arguments[0]);
                                rayTracerControl.SceneXml = xmlDoc;
                            }
                        }
                    }
                    catch (Exception ex)
                    {
                        MessageBox.Show("Die Szene konnte nicht geladen werden.\n\nMeldung: " + ex.Message, "Fehler", MessageBoxButtons.OK, MessageBoxIcon.Error);
                    }
                }
                rayTracerControl.RayTracer = Program.RayTracer;
                Program.RayTracer.Start();
            }
            else if (required)
            {
                MessageBox.Show("Die Anwendung wird gestoppt.", "Abgebrochen", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
                this.Close();
            }
            sf.Dispose();
        }

        /// <summary>
        /// Wird aufgerufen wenn das Formular geschlossen wird.
        /// </summary>
        /// <param name="sender">Der Sender.</param>
        /// <param name="e">Die Ereignisargumente.</param>
        private void MainForm_FormClosing(object sender, FormClosingEventArgs e)
        {
            if (Visible)
            {
                if (MessageBox.Show(this, "Soll der Raytracer wirklich beendet werden?", "Beenden?", MessageBoxButtons.YesNo, MessageBoxIcon.Question, MessageBoxDefaultButton.Button1) == System.Windows.Forms.DialogResult.Yes)
                {
                    if (Program.RayTracer != null) Program.RayTracer.Stop();
                }
                else e.Cancel = true;
            }
        }

        /// <summary>
        /// Schließt die Anwendung.
        /// </summary>
        /// <param name="sender">Das Sendercontrol.</param>
        private void rayTracerControl_ExitCall(RayTracerControl sender)
        {
            Close();
        }

        /// <summary>
        /// Öffnet die Einstellungen.
        /// </summary>
        /// <param name="sender">Das Sendercontrol.</param>
        private void rayTracerControl_SettingsCall(RayTracerControl sender)
        {
            Settings(false);
        }

        /// <summary>
        /// Ermöglicht Drag and Drop von Dateien auf das RayTracerControl.
        /// </summary>
        /// <param name="sender">Der Sender.</param>
        /// <param name="e">Die Ereignisargumente.</param>
        private void rayTracerControl_DragEnter(object sender, DragEventArgs e)
        {
            if (e.Data.GetDataPresent(DataFormats.FileDrop, false)) e.Effect = DragDropEffects.All;
        }

        /// <summary>
        /// Behandelt das Droppen der Datei auf das Control.
        /// </summary>
        /// <param name="sender">Der Sender.</param>
        /// <param name="e">Die Ereignisargumente.</param>
        private void rayTracerControl_DragDrop(object sender, DragEventArgs e)
        {
            string[] files = (string[])e.Data.GetData(DataFormats.FileDrop);
            try
            {
                if (files.Length > 0)
                {
                    if (File.Exists(files[0]))
                    {
                        XmlDocument xmlDoc = new XmlDocument();
                        xmlDoc.Load(files[0]);
                        rayTracerControl.SceneXml = xmlDoc;
                    }
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show("Die Szene konnte nicht geladen werden.\n\nMeldung: " + ex.Message, "Fehler", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }
        #endregion Methoden
    }
}
